import { LineSegments } from '../objects/LineSegments.js';
import { LineBasicMaterial } from '../materials/LineBasicMaterial.js';
import { Float32BufferAttribute } from '../core/BufferAttribute.js';
import { BufferGeometry } from '../core/BufferGeometry.js';
import { Color } from '../math/Color.js';

class PolarGridHelper extends LineSegments {
  constructor(radius = 10, radials = 16, circles = 8, divisions = 64, color1 = 0x444444, color2 = 0x888888) {
    color1 = new Color(color1);
    color2 = new Color(color2);

    const vertices = [];
    const colors = [];

    // create the radials

    for (let i = 0; i <= radials; i++) {
      const v = (i / radials) * (Math.PI * 2);

      const x = Math.sin(v) * radius;
      const z = Math.cos(v) * radius;

      vertices.push(0, 0, 0);
      vertices.push(x, 0, z);

      const color = i & 1 ? color1 : color2;

      colors.push(color.r, color.g, color.b);
      colors.push(color.r, color.g, color.b);
    }

    // create the circles

    for (let i = 0; i <= circles; i++) {
      const color = i & 1 ? color1 : color2;

      const r = radius - (radius / circles) * i;

      for (let j = 0; j < divisions; j++) {
        // first vertex

        let v = (j / divisions) * (Math.PI * 2);

        let x = Math.sin(v) * r;
        let z = Math.cos(v) * r;

        vertices.push(x, 0, z);
        colors.push(color.r, color.g, color.b);

        // second vertex

        v = ((j + 1) / divisions) * (Math.PI * 2);

        x = Math.sin(v) * r;
        z = Math.cos(v) * r;

        vertices.push(x, 0, z);
        colors.push(color.r, color.g, color.b);
      }
    }

    const geometry = new BufferGeometry();
    geometry.setAttribute('position', new Float32BufferAttribute(vertices, 3));
    geometry.setAttribute('color', new Float32BufferAttribute(colors, 3));

    const material = new LineBasicMaterial({ vertexColors: true, toneMapped: false });

    super(geometry, material);

    this.type = 'PolarGridHelper';
  }
}

export { PolarGridHelper };
